import {
  addVueGlobalErrorHandler,
  pageToVue,
  urlFileToVue,
  urlFileToVueAsync,
  vueTemplateCompCodeUtil
} from './VueFileUtils'
// import {parseComponent, SFCBlock} from 'vue-template-compiler'
// import {render} from "less";
import {render} from "./LessUtils";
// import * as parse from 'css-tree/parser'
// import * as stringify from 'css-tree/generator'
// import * as walk from 'css-tree/walker'
import {addCssRender, addGlobalCss, configPx2Rem} from "./CssUtils";
import {loaderRouterFile} from "./RouterUtils";
import {
  addTranslate,
  scopedId2FilePath,
  setLoaderCallBack,
  urlFileToCommon,
  urlFileToCommonAsync,
  urlFileToJs,
  urlFileToJsAsync, urlFileToJson, urlFileToJsonAsync
} from "./CommonUtils";
import {rewriteHttpUtilsCore} from "./HttpUtils";
import {pathJoin, rewriteReplaceUrl} from "./PathUtils";
import {addBabelPlugin, babelTransformCode} from "./BabelGenUtils";


const BrowseVueLoader = {
  /**
   * 重写httpUtils请求的内核
   * @param call
   */
  rewriteHttpUtilsCore,
  /**
   * 内核添加babel，这里可以添加babel的插件
   */
  addBabelPlugin,
  /**
   * 使用babel编译工具
   */
  babelTransformCode,
  /**
   * vue模板编译工具
   */
  vueTemplateCompCodeUtil,
  /**
   * 最后在url返回的时候可以自行进行处理
   * @param call
   */
  rewriteReplaceUrl,
  setLoaderCallBack,

  /**
   * 配置px转rem
   * @param run
   * @param base
   * @private
   */
  configPx2Rem,

  /**
   * 添加全局错误处理函数，提示错误在那个组件里面，以及错误的大概位置
   * @param func
   */
  addVueGlobalErrorHandler,

  addCssRender,

  /**
   * 异步加载组件
   * @param url
   */
  urlFileToVueAsync,

  /**
   * @param url
   */
  urlFileToVue,

  /**
   * 提供给浏览器查找文件url
   * @param scopedId
   */
  scopedId2FilePath,
  /**
   *
   * @param lang
   * @param content
   */
  addGlobalCss,

  /**
   * 是有路由的方法
   * @param url
   * @param appUrl
   * @param otherParams
   */
  loaderRouterFile,
  /**
   * 加载js文件导出
   * @param url
   */
  urlFileToJs,
  /**
   * 加载js文件导出，返回一个异步方法
   * @param url
   */
  urlFileToJsAsync,
  /**
   * 路径寻址
   */
  pathJoin,
  /**
   * 代码文件公共处理方式
   */
  urlFileToCommon,
  urlFileToCommonAsync,
  urlFileToJson,
  urlFileToJsonAsync,
  addTranslate,
  /**
   * 整理页面转到Vue
   *    let AppVm = BrowseVueLoader.pageToVue({
   *         el: '#app', // 需要管理的控制元素
   *         name: 'App',
   *         template: '#my-component-template',
   *     },'./index.less')
   *     返回Vue的实例
   * @param options Vue的config
   * @param cssPath 生成本地样式，可有可无
   */
  pageToVue,

  version: '', // 调整发出请求的版本号

  /**
   * 开启Vue2调试工具
   */
  openVue2Tool() {
    // @ts-ignore
    const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
    if (!hook) {
      return
    }
    // @ts-ignore
    Vue.config.devtools = true;
    // @ts-ignore
    hook.emit('init', Vue)
    // @ts-ignore
    if (Vue.$store) {
      // @ts-ignore
      const store = Vue.$store;
      store._devtoolHook = hook;
      hook.emit('vuex:init', store);
      hook.on('vuex:travel-to-state', function (targetState) {
        store.replaceState(targetState);
      });
      store.subscribe(function (mutation, state) {
        hook.emit('vuex:mutation', mutation, state);
      });
    }
  },
  /**
   * 开启Vue3调试工具
   */
  // openVue3Tool() {
  //   // @ts-ignore
  //   const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
  //   if (!hook) {
  //     return
  //   }
  //   // @ts-ignore
  //   hook.emit('app:init', Vue, Vue.version, {
  //     Fragment: 'Fragment',
  //     Text: 'Text',
  //     Comment: 'Comment',
  //     Static: 'Static'
  //   })
  // }
}

BrowseVueLoader.addCssRender('less', (style, call) => {
  if (style) {
    render(style).then(res => {
      call(res.css)
    })
  }
})


export {BrowseVueLoader}
